home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 52 / Amiga Format AFCD52 (Issue 136, May 2000).iso / -serious- / programming / other / whdload / rawdic17.lha / Examples / Starglider2.islave.asm < prev    next >
Assembly Source File  |  1999-03-01  |  5KB  |  238 lines

  1.  
  2.     ; Starglider 2 imager
  3.  
  4.     ; A track contains 6 sectors. Sector 0 to 4 contain 1024 bytes data,
  5.     ; sector 5 contains only 512 bytes. (Total: $1600 bytes)
  6.  
  7.     ; sector format description:
  8.  
  9.     ; sync ($4489)
  10.     ; 1 byte header ID (MFM: $5554)
  11.     ; 2 unused bytes
  12.     ; 1 byte sector number (0-5) + $F5
  13.     ; 1 byte
  14.     ; 1 word checksum
  15.     ; gap
  16.     ; sync ($4489)
  17.     ; 1 byte data block ID (MFM: $5545)
  18.     ; 1024 or 512 bytes data
  19.     ; 1 word checksum
  20.  
  21.     ; The checksum test is quite strange, a CRC16 calculation is done
  22.     ; which always leads to 0 when everything went ok.
  23.     ; Part of the CRC16 calculation are also 3 sync signal words and
  24.     ; the header/data block ID, and ofcourse the checksum.
  25.  
  26.     ; The MFM decoding is done by skipping all odd bits in the bitstream.
  27.  
  28.     ; Similar formats: Virus (uses the same CRC16 method)
  29.  
  30.         incdir    Includes:
  31.         include    RawDIC.i
  32.  
  33.         SLAVE_HEADER
  34.         dc.b    1    ; Slave version
  35.         dc.b    0    ; Slave flags
  36.         dc.l    DSK_1    ; Pointer to the first disk structure
  37.         dc.l    Text    ; Pointer to the text displayed in the imager window
  38.  
  39.         dc.b    "$VER:"
  40. Text:        dc.b    "Starglider 2 imager V1.0",10,"by John Selck on 03.01.1999",0
  41.         cnop    0,4
  42.  
  43. DSK_1:        dc.l    0        ; Pointer to next disk structure
  44.         dc.w    1        ; Disk structure version
  45.         dc.w    DFLG_SINGLESIDE    ; Disk flags
  46.         dc.l    TL_1        ; List of tracks which contain data
  47.         dc.l    0        ; UNUSED, ALWAYS SET TO 0!
  48.         dc.l    FL_1        ; List of files to be saved
  49.         dc.l    0        ; Table of certain tracks with CRC values
  50.         dc.l    0        ; Alternative disk structure, if CRC failed
  51.         dc.l    Init        ; Called before a disk is read
  52.         dc.l    0        ; Called after a disk has been read
  53.  
  54. TL_1:        TLENTRY    3,77,$1600,SYNC_STD,DMFM_Sg2
  55.         TLEND
  56.  
  57. FL_1:        FLENTRY    FName,0,FL_DISKLENGTH
  58.         FLEND
  59.  
  60. FName:        dc.b    "Starglider2",0
  61.         cnop    0,2
  62.  
  63. DMFM_Sg2:
  64.         move.w    d0,a4    ; save tracknumber
  65.  
  66.         lea    SectorFlags(pc),a2
  67.         moveq    #5,d1
  68. .l0        sf    (a2)+        ; clear sector flags
  69.         dbra    d1,.l0
  70.  
  71.         moveq    #5,d1
  72.         bra.b    .s0        ; don't search first sync
  73. .l1        jsr    rawdic_NextSync(a5)
  74. .s0        cmp.w    #$5554,(a0)
  75.         bne.b    .l1
  76.  
  77.         bsr.b    DMFM_S2_header
  78.         bne.b    .error
  79.  
  80.         jsr    rawdic_NextSync(a5)    ; search data block
  81.         cmp.w    #$5545,(a0)
  82.         bne.b    .s0
  83.  
  84.         move.b    d2,d0
  85.  
  86.         bsr    DMFM_S2_data
  87.         bne.b    .error
  88.         dbra    d1,.l1
  89.  
  90.         lea    SectorFlags(pc),a2
  91.         moveq    #5,d1
  92. .l2        tst.b    (a2)+        ; if one sector is missing, one of
  93.         dbeq    d1,.l2        ; these flags will be FALSE
  94.         beq.b    .nosect
  95.  
  96.         lea    Counter(pc),a0
  97.         move.l    (a0),d3
  98.         move.l    #$aaaaaaaa,d2
  99.         move.w    #$1600/4-1,d1
  100. .l3        move.l    (a1),d0
  101.         eor.l    d2,d0
  102.         sub.l    d3,d0
  103.         ror.l    #1,d0
  104.         subq.l    #1,d3
  105.         bmi.b    .exit
  106.         move.l    d0,(a1)+
  107.         dbra    d1,.l3
  108. .exit        move.l    d3,(a0)
  109.  
  110.         cmp.w    #3,a4
  111.         bne.b    .s1
  112.         move.w    #$8001,2-$1600(a1)
  113. .s1
  114.         moveq    #IERR_OK,d0
  115. .error        rts
  116. .nosect        moveq    #IERR_NOSECTOR,d0
  117.         rts
  118.  
  119. DMFM_S2_header:
  120.  
  121.         ; => D2.b=sector number
  122.  
  123.         movem.l    d1/a0,-(sp)
  124.  
  125.         bsr.b    InitCRC16
  126.         moveq    #9,d6
  127.         bsr.b    StreamCalcCRC16
  128.         or.b    d2,d3        ; header checksum ok?
  129.         bne.b    .error
  130.  
  131.         subq.l    #4*2,a0        ; 4 bytes back
  132.         bsr.b    NextByte    ; get sector number
  133.         sub.b    #$f5,d0
  134.         move.b    d0,d2
  135.  
  136.         movem.l    (sp)+,d1/a0
  137.         moveq    #IERR_OK,d0
  138.         rts
  139. .error        movem.l    (sp)+,d1/a0
  140.         moveq    #IERR_CHECKSUM,d0
  141.         rts
  142.  
  143. DMFM_S2_data:
  144.  
  145.         ; D0.b=sector number
  146.  
  147.         movem.l    d1/a0-a1,-(sp)
  148.  
  149.         move.w    #$03ff,d5
  150.         cmp.b    #5,d0
  151.         bhi.b    .error
  152.         bne.b    .s0
  153.         move.w    #$01ff,d5
  154. .s0
  155.         lea    SectorFlags(pc),a2
  156.         and.w    #$00ff,d2
  157.         st    (a2,d2.w)
  158.  
  159.         lsl.w    #8,d0
  160.         lsl.w    #2,d0
  161.         add.w    d0,a1
  162.  
  163.         bsr.b    InitCRC16
  164.         moveq    #3,d6
  165.         bsr.b    StreamCalcCRC16
  166.  
  167. .l1        bsr.b    NextByte    ; calculate header checksum
  168.         bsr.b    CalcCRC16
  169.         move.b    d0,(a1)+
  170.         dbra    d5,.l1
  171.  
  172.         moveq    #1,d6
  173.         bsr.b    StreamCalcCRC16
  174.  
  175.         or.b    d2,d3
  176.         bne.b    .error
  177.  
  178.         movem.l    (sp)+,d1/a0-a1
  179.         moveq    #IERR_OK,d0
  180.         rts
  181. .error        movem.l    (sp)+,d1/a0-a1
  182.         moveq    #IERR_CHECKSUM,d0
  183.         rts
  184.  
  185. InitCRC16:    lea    CRC_table,a2    ; initialise registers for CalcCRC16
  186.         moveq    #0,d1
  187.         moveq    #-1,d2
  188.         moveq    #-1,d3
  189.         subq.l    #3*2,a0        ; 3 syncwords needed for CRC calculation
  190.         rts
  191.  
  192. StreamCalcCRC16:
  193. .l0        bsr.b    NextByte
  194.         bsr.b    CalcCRC16
  195.         dbra    d6,.l0
  196.         rts
  197.  
  198. NextByte:    move.w    (a0)+,d0
  199.         BITSKIP_B d0
  200.         rts
  201. CalcCRC16:
  202.         move.b    d0,d1
  203.         eor.b    d2,d1
  204.         lea    (a2,d1.w),a3
  205.         move.b    (a3),d2
  206.         eor.b    d3,d2
  207.         move.b    $0100(a3),d3
  208.         rts
  209.  
  210. Init:        ; initialisation of the CRC table.
  211.  
  212.         lea    CRC_table,a0
  213.         moveq    #0,d1
  214. .l1        moveq    #0,d2
  215.         move.b    d1,d2
  216.         lsl.w    #8,d2
  217.         moveq    #7,d0
  218. .l0        add.w    d2,d2
  219.         bcc.b    .s0
  220.         eor.w    #$1021,d2    ; $1021 = standard CRC16 value
  221. .s0        dbra    d0,.l0
  222.         move.b    d2,$0100(a0)
  223.         lsr.w    #8,d2
  224.         move.b    d2,(a0)+
  225.         addq.b    #1,d1
  226.         bne.b    .l1
  227.  
  228.         moveq    #IERR_OK,d0
  229.         rts
  230.  
  231. Counter:    dc.l    $1997b    ; counter value from starglider 2 disk routines
  232. SectorFlags:    ds.b    6
  233.  
  234.     section    "BSS",bss
  235.  
  236. CRC_table:    ds.b    $200
  237.  
  238.